#include "protheus.ch"
#include "rwmake.ch"
#include "TOPCONN.CH"

/*
+-------------------------+-------------------------------------------+----------------------+
|Funcao: AT300GRV         |Ghandy						          		    | Data: 15/06/2013     |
+-------------------------+-------------------------------------------+----------------------+
|Descricao:  Ponto de entrada chamado apos a gravacao de chamados 		   		            |
+--------------------------------------------------------------------------------------------+
|Uso: Modulo Gestao de Servicos - Tratar chamados do Sitema Jupiter Mobile					   	|
|	                                                                                       	|
+--------------------------------------------------------------------------------------------+
|                     ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO INICIAL.                      |
+-------------------------+------------+-----------------------------------------------------+
|Programador              |   Data     |             Motivo da Alteracao                     |
+-------------------------+------------+-----------------------------------------------------+
|Ghandy                   | 15/07/2013 | Incluido todas as funcoes em somente um ponto de    |
| 			                 | 				| entrada.														   |
+-------------------------+------------+-----------------------------------------------------+
|Ghandy                   | 01/08/2013 | Incluido checagem de data para interromper execucao |
| 			                 | 				| do piloto														   |
+-------------------------+------------+-----------------------------------------------------+
*/

***********************************************************
User Function AT300GRV()
***********************************************************
Local _lRet	 :=.T.

IF Date() > CTOD("28/08/2013")
	MsgBox("O prazo para teste se encerrou em 28/08/2013.", "Prazo Expirado", "Alert")
	Return .F.
ENDIF
// checa se quem chamou o ponto de entrada foi a rotina de exclusao
IF !INCLUI .AND. !ALTERA
	// exclui chamado da tabela de chamado x tecnico do sistema Jupiter Mobile
	DelChJupiter()
ELSEIF INCLUI
	IF VldTec()
		IncChJupiter()
	ENDIF
ELSEIF ALTERA
	// se alterou o chamado verifica se o chamado existe no sistema Jupiter
	DbSelectArea("ZZJ")
	DbSetOrder(1)
	DbSeek(xFilial("ZZJ")+M->AB1_NRCHAM)
   IF ZZJ->(Eof())	
		// se nao existir o chamado no sistema Jupiter, verifica se ha tecnico alocado
		IF VldTec()
			// se tiver tecnico com PDA inclui o chamado no sistema Jupiter
			IncChJupiter()
		ENDIF
	ELSE
		// se nao existir tecnico alocado ou se o tecnico nao possuir PDA
		IF !VldTec()
			// exclui o chamado do sistema Jupiter
			DelChJupiter()
		ELSE
			AltChJupiter()
		ENDIF
	ENDIF
Endif 
Return(_lRet)

***********************************************************
Static Function IncChJupiter()
***********************************************************

//----- posiciona os arquivos relacionados ao chamado ------
DbSelectArea("SA1")
DbSetOrder(1)
DbSeek(xFilial("SA1")+M->AB1_CODCLI+M->AB1_LOJA)
 
DbSelectArea("ZZ6")
DbSetOrder(1)
DbSeek(xFilial("ZZ6")+acols[1][6]) //Ocorrencia

//----- Inclui o registro na tabela de chamados do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZJ")
DbSetOrder(1)
RecLock("ZZJ",.T.)  //registro novo
ZZJ->ZJ_FILIAL 	:= xFilial("ZZJ")
ZZJ->ZJ_NUM			:= M->AB1_NRCHAM
ZZJ->ZJ_SITUAC		:= M->AB1_JUSITU
ZZJ->ZJ_ATIVIDA 	:= acols[1][6] // Ocorrencia
ZZJ->ZJ_SEQUENC 	:= 0
ZZJ->ZJ_DEFEITO 	:= acols[1][7] // Descricao
ZZJ->ZJ_OBSCENT 	:= acols[1][8] // Memo
ZZJ->ZJ_CODCLI		:= M->AB1_CODCLI+M->AB1_LOJA
ZZJ->ZJ_NOMCLI		:= SA1->A1_NREDUZ
ZZJ->ZJ_RAZCLI		:= SA1->A1_NOME
ZZJ->ZJ_CNPJ		:= SA1->A1_CGC
ZZJ->ZJ_IERG		:= SA1->A1_INSCR
ZZJ->ZJ_CIDADE		:= SA1->A1_MUN
ZZJ->ZJ_ENDCLI		:= SA1->A1_END
ZZJ->ZJ_NUMERO		:= ""
ZZJ->ZJ_BAIRRO		:= SA1->A1_BAIRRO
ZZJ->ZJ_CEP			:= SA1->A1_CEP
ZZJ->ZJ_CONTATO 	:= M->AB1_CONTAT
ZZJ->ZJ_TEL			:= M->AB1_TEL
ZZJ->ZJ_PTREFER 	:= SA1->A1_COMPLEM
ZZJ->ZJ_STATUS	 	:= "E" // Enviado do ERP
ZZJ->ZJ_DATAHOR		:= SUBSTR(DTOS(DATE()),1,4) + "-" + SUBSTR(DTOS(DATE()),5,2) + "-" + SUBSTR(DTOS(DATE()),7,2) + "-" + TIME()

ZZJ->(MsUnLock())
 
//----- Inclui os relacionamentos na tabela de chamados X atividades do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZ6")
DbSetOrder(2) // Filial + Atividade + Evento

DbSelectArea("ZZM")
DbSetOrder(1)
While acols[1][6] == ZZ6->Z6_CODATIV  // Relaciona todas os eventos para a atividade selecionada no chamado
	RecLock("ZZM",.T.)  //registro novo
	ZZM->ZM_FILIAL 	:= xFilial("ZZM")
	ZZM->ZM_CHAMADO	:= M->AB1_NRCHAM
	ZZM->ZM_CODEVE		:= ZZ6->Z6_CODEVE
	ZZM->ZM_ORDEM		:= ZZ6->Z6_ORDEM	
	ZZM->ZM_OBCHKLI 	:= ZZ6->Z6_OBCHKLI
	ZZM->ZM_OBINFEV 	:= ZZ6->Z6_OBINFEV
	ZZM->(MsUnLock())
	ZZ6->(DbSkip())
End While	

//----- Inclui os relacionamentos na tabela de chamados X tecnico do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZC")
RecLock("ZZC",.T.)  //registro novo
ZZC->ZC_FILIAL		:= xFilial("ZZC")
ZZC->ZC_CHAMADO	:= M->AB1_NRCHAM
ZZC->ZC_CODTEC		:= M->AB1_JUCTEC
ZZC->(MsUnLock())
Return NIL


***********************************************************
Static Function AltChJupiter()
***********************************************************

//----- posiciona os arquivos relacionados ao chamado ------
DbSelectArea("SA1")
DbSetOrder(1)
DbSeek(xFilial("SA1")+M->AB1_CODCLI+M->AB1_LOJA)
 
DbSelectArea("ZZ6")
DbSetOrder(1)
DbSeek(xFilial("ZZ6")+acols[1][6]) //Ocorrencia

//----- Altera o registro na tabela de chamados do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZJ")
DbSetOrder(1)
DbSeek(xFilial("ZZJ")+M->AB1_NRCHAM)
IF !ZZJ->(Eof())
	RecLock("ZZJ",.F.)
	ZZJ->ZJ_FILIAL 	:= xFilial("ZZJ")
	ZZJ->ZJ_NUM			:= M->AB1_NRCHAM
	ZZJ->ZJ_SITUAC		:= M->AB1_JUSITU
	ZZJ->ZJ_ATIVIDA 	:= acols[1][6] // Ocorrencia
	ZZJ->ZJ_SEQUENC 	:= 0
	ZZJ->ZJ_DEFEITO 	:= acols[1][7] // Descricao
	ZZJ->ZJ_OBSCENT 	:= acols[1][8] // Memo
	ZZJ->ZJ_CODCLI		:= M->AB1_CODCLI+M->AB1_LOJA
	ZZJ->ZJ_NOMCLI		:= SA1->A1_NREDUZ
	ZZJ->ZJ_RAZCLI		:= SA1->A1_NOME
	ZZJ->ZJ_CNPJ		:= SA1->A1_CGC
	ZZJ->ZJ_IERG		:= SA1->A1_INSCR
	ZZJ->ZJ_CIDADE		:= SA1->A1_MUN
	ZZJ->ZJ_ENDCLI		:= SA1->A1_END
	ZZJ->ZJ_NUMERO		:= ""
	ZZJ->ZJ_BAIRRO		:= SA1->A1_BAIRRO
	ZZJ->ZJ_CEP			:= SA1->A1_CEP
	ZZJ->ZJ_CONTATO 	:= M->AB1_CONTAT
	ZZJ->ZJ_TEL			:= M->AB1_TEL
	ZZJ->ZJ_PTREFER 	:= SA1->A1_COMPLEM
	ZZJ->ZJ_STATUS	 	:= "E" // Enviado do ERP
	ZZJ->ZJ_DATAHOR		:= SUBSTR(DTOS(DATE()),1,4) + "-" + SUBSTR(DTOS(DATE()),5,2) + "-" + SUBSTR(DTOS(DATE()),7,2) + "-" + TIME()
	ZZJ->(MsUnLock())
ENDIF	 

//----- Altera os relacionamentos na tabela de chamados X atividades do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZ6")
DbSetOrder(2) // Filial + Atividade + Evento

DbSelectArea("ZZM")
DbSetOrder(1)
DbSeek(xFilial("ZZM")+M->AB1_NRCHAM)
//IF !ZZM->(Eof())
	While acols[1][6] == ZZ6->Z6_CODATIV  // Relaciona todas os eventos para a atividade selecionada no chamado
		IF ZZM->ZM_CHAMADO == M->AB1_NRCHAM
			RecLock("ZZM",.F.) // altera os eventos
		ELSE
			RecLock("ZZM",.T.) // caso tenha mais eventos que o chamado anterior inclui os novos eventos
		ENDIF
		ZZM->ZM_FILIAL 	:= xFilial("ZZM")
		ZZM->ZM_CHAMADO	:= M->AB1_NRCHAM
		ZZM->ZM_CODEVE		:= ZZ6->Z6_CODEVE
		ZZM->ZM_ORDEM		:= ZZ6->Z6_ORDEM	
		ZZM->ZM_OBCHKLI 	:= ZZ6->Z6_OBCHKLI
		ZZM->ZM_OBINFEV 	:= ZZ6->Z6_OBINFEV
		ZZM->(MsUnLock())
		ZZM->(DbSkip())
		ZZ6->(DbSkip())
	End While
	// exclui os eventos que sobraram do chamado anterior
	While ZZM->ZM_CHAMADO == M->AB1_NRCHAM .AND. !ZZM->(Eof())
		RecLock("ZZM",.F.)
		ZZM->(DbDelete())
		ZZM->(MsUnLock())
		ZZM->(DbSkip())
	End While
//ENDIF

//----- Altera os relacionamentos na tabela de chamados X tecnico do sistema Jupiter Mobile ------------------------------
DbSelectArea("ZZC")
DbSetOrder(2)
DbSeek(xFilial("ZZC")+M->AB1_NRCHAM)
IF !ZZC->(Eof())
	RecLock("ZZC",.F.)
	ZZC->ZC_FILIAL		:= xFilial("ZZC")
	ZZC->ZC_CHAMADO	:= M->AB1_NRCHAM
	ZZC->ZC_CODTEC		:= M->AB1_JUCTEC
	ZZC->(MsUnLock())
ENDIF
Return NIL

***********************************************************
Static Function DelChJupiter()
***********************************************************
DbSelectArea("ZZC")
DbSetOrder(2)
DbSeek(xFilial("ZZC")+M->AB1_NRCHAM)
   IF !ZZC->(Eof())
	RecLock("ZZC",.F.)
	ZZC->(DbDelete())
	ZZC->(MsUnLock())
ENDIF

// exclui chamado da tabela de chamado do sistema Jupiter Mobile
DbSelectArea("ZZJ")
DbSetOrder(1)
DbSeek(xFilial("ZZJ")+M->AB1_NRCHAM)
   IF !ZZJ->(Eof())
	RecLock("ZZJ",.F.)
	ZZJ->(DbDelete())
	ZZJ->(MsUnLock())
ENDIF

// exclui chamado da tabela de chamado x atividade do sistema Jupiter Mobile
DbSelectArea("ZZM")
DbSetOrder(1)
DbSeek(xFilial("ZZM")+M->AB1_NRCHAM)
While ZZM->ZM_CHAMADO == M->AB1_NRCHAM .AND. !ZZM->(Eof())
	RecLock("ZZM",.F.)
	ZZM->(DbDelete())
	ZZM->(MsUnLock())
	ZZM->(DbSkip())
End While

// exclui chamado da tabela de chamado x Atendimento do sistema Jupiter Mobile
DbSelectArea("ZZN")
DbSetOrder(1)
DbSeek(xFilial("ZZN")+M->AB1_NRCHAM)
While ZZN->ZN_CHAMADO == M->AB1_NRCHAM .AND. !ZZN->(Eof())
	RecLock("ZZN",.F.)
	ZZN->(DbDelete())
	ZZN->(MsUnLock())
	ZZN->(DbSkip())
End While

// exclui chamado da tabela de chamado x material do sistema Jupiter Mobile
DbSelectArea("ZZO")
DbSetOrder(1)
DbSeek(xFilial("ZZO")+M->AB1_NRCHAM)
While ZZO->ZO_CHAMADO == M->AB1_NRCHAM .AND. !ZZO->(Eof())
	RecLock("ZZO",.F.)
	ZZO->(DbDelete())
	ZZO->(MsUnLock())
	ZZO->(DbSkip())
End While

// exclui chamado da tabela de chamado x inventario do sistema Jupiter Mobile
DbSelectArea("ZZP")
DbSetOrder(1)
DbSeek(xFilial("ZZP")+M->AB1_NRCHAM)
While ZZP->ZP_CHAMADO == M->AB1_NRCHAM .AND. !ZZP->(Eof())
	RecLock("ZZP",.F.)
	ZZP->(DbDelete())
	ZZP->(MsUnLock())
	ZZP->(DbSkip())
End While

// exclui chamado da tabela de chamado x fotos do sistema Jupiter Mobile
DbSelectArea("ZZQ")
DbSetOrder(1)
DbSeek(xFilial("ZZQ")+M->AB1_NRCHAM)
While ZZQ->ZQ_CHAMADO == M->AB1_NRCHAM .AND. !ZZQ->(Eof())
	RecLock("ZZQ",.F.)
	ZZQ->(DbDelete())
	ZZQ->(MsUnLock())
	ZZQ->(DbSkip())
End While
Return NIL

***********************************************************
Static Function VldTec()
***********************************************************
Local _lRet:=.F.

IF !EMPTY(M->AB1_JUCTEC)
	//----- Verifica se o tecnico possui equipamento mobile
	DbSelectArea("AA1")
	DbSetOrder(1)
	DbSeek(xFilial("AA1")+M->AB1_JUCTEC)
	IF AA1->AA1_JUPDA == "1" // se o tecnico possui PDA
		_lRet:=.T.
	ENDIF
ENDIF
Return(_lRet)
